home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / tool / genji / src / g_main.c < prev    next >
Text File  |  1995-08-13  |  11KB  |  528 lines

  1. #include "genji.h"
  2.  
  3. #include "netdata.c"
  4. #include "printcom.c"
  5.  
  6. char    *errmes[8] = {
  7.                     "\x0",
  8.                     "\x0",
  9.                     "プリンタ指定エラー1です",
  10.                     "プリンタ指定エラー2です",
  11.                     "用紙が切れています",
  12.                     "プリンタがオフラインです",
  13.                     "次のページの紙をセットしてください",
  14.                     "プリンタが原因不明のエラーです" };
  15.  
  16. char    pool[256];
  17.  
  18. void    dataInit()
  19. {
  20.     colrev_flg = OFF;
  21.     pitchmask = 2;    /* truepitch = pitch * pitchmask / 2 */
  22. /*    tabsize = 4;*/
  23.     pitch = 54;        /* 全角文字の文字ピッチ */
  24.     cr_p = 60;        /* 改行幅 */
  25.     net_length = 0;
  26.     net_flg = OFF;
  27.     jisflg = OFF;
  28. /*    leftmargin = 0;*/
  29.     pageflg = OFF;
  30.     np = 1;
  31.     info[np][0] = 0;/*現在明朝体*/
  32.     info[np][1] = KS_XN_YN;/*現在文字サイズ標準*/
  33.     y_pos = 0;
  34.     endflg = OFF;
  35.     page = 1;
  36.     mode = 'A';
  37.     writepage = OFF;
  38.     lnum = 0;
  39.     control = OFF;
  40.     bufp = outbuf;
  41. /*    betaflg = OFF;*/
  42.  
  43.     return;
  44. }
  45.  
  46. void    genji_mainPG( char *pdrname, char *defname, int betaflg )
  47. {
  48.     FILE    *fp;
  49.     union
  50.     {
  51.         unsigned short int    sjis;
  52.         char    c[2];
  53.     } moji;
  54.     struct ffblk    fb;
  55.     unsigned int    size;
  56.     int        ch,e,i,j,comflg,sflg;
  57.     char    combuf[16],usrbuf[256],gjbuf[288],gjbuf2[72];
  58.     char    *p;
  59.  
  60.     dataInit();
  61.  
  62.     if( findfirst( pdrname, &fb, 0 ) )
  63.     {
  64.         VC_printf( "\"%s\"が見つかりません。\n", POINTER, pdrname );
  65.         return;
  66.     }
  67.  
  68.     size = fb.ff_fsize.high<<16 | fb.ff_fsize.low;
  69.  
  70.     if( ( file = (char *)malloc( size ) ) == NULL )
  71.     {
  72.         VC_printf( "メモリが足りません。\n" );
  73.         return;
  74.     }
  75.  
  76.     if( ( fp = fopen( pdrname, "rb" ) ) == NULL )
  77.     {
  78.         VC_printf( "'%s'が読み込めません。\n", POINTER, pdrname );
  79.         return;
  80.     }
  81.  
  82.     if( fread( file, 1, size, fp ) < size )
  83.     {
  84.         VC_printf( "データの読み込みに失敗しました。\n" );
  85.         fclose( fp );
  86.         return;
  87.     }
  88.     fclose( fp );
  89.  
  90.     file_ = file;
  91.  
  92.     bufp += addstrings( init, bufp );    /*解像度360dpi + 半角1byte指定*/
  93.     setLeftmargin( leftmargin );
  94.     VC_printf( "現在%dページ目を印刷中です。\n", UL_INT, page );
  95.     while( endflg == OFF )
  96.     {
  97.         lineInit();
  98.         sflg = ON;
  99.         while( lineflg == OFF )
  100.         {
  101.             comflg = OFF;
  102.             ch = (*file++) & 0xff;
  103.  
  104.             if( file - file_ > size )
  105.             {
  106.                 *bufp++ = 0x0a;
  107.                 pageflg = ON;
  108.                 endflg = ON;
  109.                 break;
  110.             }
  111.  
  112.             if( betaflg == ON )
  113.                 goto LABEL01;
  114.  
  115.             if( sflg == ON && ch == '#' )
  116.             {
  117.                 control = ON;
  118.                 continue;
  119.             }
  120.             sflg = OFF;
  121.             if( ch == '}' && np > 1 )
  122.             {
  123.                 switch( nest[np--] )
  124.                 {
  125.                     case 10:/*文字サイズ*/
  126.                         setKanjiSize( info[np][1] );
  127.                         break;
  128.                     case 19:/*フォント*/
  129.                         setFontType( info[np][0] );
  130.                         break;
  131.                     case 21:/*漢字アンダーライン解除*/
  132.                         setUnderline( OFF );
  133.                         break;
  134.                     case 32:/*欧文ピッチ解除*/
  135.                         bufp += addstrings( prooff, bufp );
  136.                         break;
  137.                     case 40:/*網掛け解除*/
  138.                         setNetEnd();
  139.                         break;
  140.                     case 47:/*白黒反転*/
  141.                         setColorReverse();
  142.                         break;
  143.                 }
  144.                 continue;
  145.             }
  146.  
  147.             if( ch == '/' )
  148.             {
  149.                 for( i=0; i<15; i++ )
  150.                     combuf[i] = (*(file+i)) & 0xff;
  151.                 combuf[16] = 0;
  152.  
  153.                 switch( getCommand2() )
  154.                 {
  155.                     case 1:/*半角1byte指定*/
  156.                         bufp += addstrings( hss2, bufp );
  157.                         comflg = ON;
  158.                         break;
  159.                     case 2:/*上付文字開始*/
  160.                         if( pool[0] == 0 )
  161.                             break;
  162.                         incNest( 10 );
  163.                         setBaseLine( BL_UPPER );
  164.                         setKanjiSize( KS_XH_YH );
  165.                         comflg = ON;
  166.                         break;
  167.                     case 4:/*下付文字開始*/
  168.                         if( pool[0] == 0 )
  169.                             break;
  170.                         incNest( 10 );
  171.                         setBaseLine( BL_BOTTOM );
  172.                         setKanjiSize( KS_XH_YH );
  173.                         comflg = ON;
  174.                         break;
  175.                     case 6:/*漢字文字ピッチ*/
  176.                         if( pool[1] == 0 )
  177.                             break;
  178.                         i = DWORD( pool+2 );
  179.                         if( i<48 || i>120 )
  180.                             break;
  181.                         pitch = i;
  182.                         setKanjiPitch( pitch );
  183.                         comflg = ON;
  184.                         break;
  185.                     case 8:/*改行ピッチ*/
  186.                         if( pool[1] == 0 )
  187.                             break;
  188.                         i = DWORD( pool+2 );
  189.                         if( i<1 || i>120 )
  190.                             break;
  191.                         cr_p = i;
  192.                         setReturnPitch( cr_p );
  193.                         comflg = ON;
  194.                         break;
  195.                     case 10:/*標準*/
  196.                         if( pool[0] )
  197.                             incNest( 10 );
  198.                         pitchmask = 2;
  199.                         setKanjiSize( KS_XN_YN );
  200.                         comflg = ON;
  201.                         break;
  202.                     case 11:/*横倍*/
  203.                         if( pool[0] )
  204.                             incNest( 10 );
  205.                         pitchmask = 4;
  206.                         setKanjiSize( KS_XD_YN );
  207.                         comflg = ON;
  208.                         break;
  209.                     case 12:/*縦倍*/
  210.                         if( pool[0] )
  211.                             incNest( 10 );
  212.                         pitchmask = 2;
  213.                         setKanjiSize( KS_XN_YD );
  214.                         comflg = ON;
  215.                         break;
  216.                     case 13:/*縦横倍*/
  217.                         if( pool[0] )
  218.                             incNest( 10 );
  219.                         pitchmask = 4;
  220.                         setKanjiSize( KS_XD_YD );
  221.                         comflg = ON;
  222.                         break;
  223.                     case 14:/*縦半分*/
  224.                         if( pool[0] )
  225.                             incNest( 10 );
  226.                         pitchmask = 2;
  227.                         setKanjiSize( KS_XN_YH );
  228.                         comflg = ON;
  229.                         break;
  230.                     case 15:/*横半分*/
  231.                         if( pool[0] )
  232.                             incNest( 10 );
  233.                         pitchmask = 1;
  234.                         setKanjiSize( KS_XH_YN );
  235.                         comflg = ON;
  236.                         break;
  237.                     case 16:/*縦半分横倍*/
  238.                         if( pool[0] )
  239.                             incNest( 10 );
  240.                         pitchmask = 4;
  241.                         setKanjiSize( KS_XD_YH );
  242.                         comflg = ON;
  243.                         break;
  244.                     case 17:/*縦倍横半分*/
  245.                         if( pool[0] )
  246.                             incNest( 10 );
  247.                         pitchmask = 1;
  248.                         setKanjiSize( KS_XH_YD );
  249.                         comflg = ON;
  250.                         break;
  251.                     case 18:/*縦横半分*/
  252.                         if( pool[0] )
  253.                             incNest( 10 );
  254.                         pitchmask = 1;
  255.                         setKanjiSize( KS_XH_YH );
  256.                         comflg = ON;
  257.                         break;
  258.                     case 19:/*ゴシック*/
  259.                         if( pool[0] )
  260.                             incNest( 19 );
  261.                         setFontType( 1 );
  262.                         comflg = ON;
  263.                         break;
  264.                     case 20:/*明朝体*/
  265.                         if( pool[0] )
  266.                             incNest( 19 );
  267.                         setFontType( 0 );
  268.                         comflg = ON;
  269.                         break;
  270.                     case 21:/*漢字アンダーライン指定*/
  271.                         if( ! pool[0] )
  272.                             break;
  273.                         incNest( 21 );
  274.                         setUnderline( ON );
  275.                         comflg = ON;
  276.                         break;
  277.                     case 27:/*罫線接続指定*/
  278.                         setLineConnect( ON );
  279.                         comflg = ON;
  280.                         break;
  281.                     case 28:/*罫線接続解除*/
  282.                         setLineConnect( OFF );
  283.                         comflg = ON;
  284.                         break;
  285.                     case 29:/*漢字縦倍上端合わせ*/
  286.                         setBaseLine( 0 );
  287.                         comflg = ON;
  288.                         break;
  289.                     case 30:/*漢字縦倍下端合わせ*/
  290.                         setBaseLine( 1 );
  291.                         comflg = ON;
  292.                         break;
  293.                     case 31:/*漢字縦倍中心合わせ*/
  294.                         setBaseLine( 2 );
  295.                         comflg = ON;
  296.                         break;
  297.                     case 32:/*欧文ピッチ指定*/
  298.                         if( pool[0] == 0 )
  299.                             break;
  300.                         bufp += addstrings( proon, bufp );
  301.                         incNest( 32 );
  302.                         comflg = ON;
  303.                         break;
  304.                     case 38:/*ページ変更*/
  305.                         pageflg = ON;
  306.                         comflg = ON;
  307.                         break;
  308.                     case 39:/*レフトマージン指定*/
  309.                         if( pool[1] == 0 )
  310.                             break;
  311.                         i = DWORD( pool+2 );
  312.                         if( i<0 || i>80 )
  313.                             break;
  314.                         setLeftmargin( i );
  315.                         leftmargin = i;
  316.                         comflg = ON;
  317.                         break;
  318.                     case 40:/*網掛け*/
  319.                         if( pool[1] == 0 || pool[0] == 0 )
  320.                             break;
  321.                         net_sort = DWORD( pool+2 );
  322.                         if( net_sort<0 || net_sort>4 )
  323.                             break;
  324.                         setNetStart();
  325.                         incNest( 40 );
  326.                         comflg = ON;
  327.                         break;
  328.                     case 41:/*漢字縦書き指定*/
  329.                         setPrintDirection( 1 );
  330.                         comflg = ON;
  331.                         break;
  332.                     case 42:/*漢字横書き指定*/
  333.                         setPrintDirection( 0 );
  334.                         comflg = ON;
  335.                         break;
  336.                     case 43:/*毛筆体*/
  337.                         if( pool[0] )
  338.                             incNest( 19 );
  339.                         setFontType( 2 );
  340.                         comflg = ON;
  341.                         break;
  342.                     case 44:/*丸文字*/
  343.                         if( pool[0] )
  344.                             incNest( 19 );
  345.                         setFontType( 3 );
  346.                         comflg = ON;
  347.                         break;
  348.                     case 45:/*教科書体*/
  349.                         if( pool[0] )
  350.                             incNest( 19 );
  351.                         setFontType( 4 );
  352.                         comflg = ON;
  353.                         break;
  354.                     case 46:/*JIS指定*/
  355.                         if( pool[1] == 0 )
  356.                             break;
  357.                         jiscode = DWORD( pool+2 );
  358.                         goto D_JIS_IN;
  359.                         break;
  360.                     case 47:/*白黒反転*/
  361.                         if( pool[0] )
  362.                             incNest( 47 );
  363.                         setColorReverse();
  364.                         comflg = ON;
  365.                         break;
  366.                     case 48:/*タブサイズ指定*/
  367.                         if( pool[1] == 0 )
  368.                             break;
  369.                         i = DWORD( pool+2 );
  370.                         if( i<0 || i>8 )
  371.                             break;
  372.                         tabsize = i;
  373.                         comflg = ON;
  374.                         break;
  375.                 }
  376.                 if( comflg == ON )
  377.                     continue;
  378.  
  379.                 ch = (*file++) & 0xff;
  380.             }
  381. LABEL01:
  382.             if( ch == 0x0a )
  383.             {
  384.                 if( control == OFF )
  385.                 {
  386.                     if( net_flg == ON )
  387.                         net_length = x_pos - net_sp;
  388.                     if( net_length > 0 )
  389.                         printNet();
  390.                     *bufp++ = 0x0a;
  391.                 }
  392.                 lineflg = ON;
  393.                 break;
  394.             }
  395.  
  396.             if( control )
  397.                 continue;
  398.  
  399.             if( ch == 0x09 )
  400.             {
  401.                 setAsciiMode();
  402.                 do
  403.                 {
  404.                     addstrings( "\x20", bufp );
  405.                     bufp ++;
  406.                     x_pos += pitch*pitchmask/4;
  407.                 }
  408.                 while( ( ( x_pos - leftmargin*27 )/ (pitch/2) ) % tabsize );
  409.  
  410.                 continue;
  411.             }
  412.  
  413.             if( ch>0xe0 || (ch>0x80 && ch<0xa0) )
  414.             {
  415.                 moji.c[1] = (unsigned char)ch;
  416.                 moji.c[0] = (unsigned char)(*file) & 0xff;
  417.                 file++;
  418.  
  419.                 jiscode = FNT_sjisToJis( (int)moji.sjis );
  420. D_JIS_IN:
  421.                 setKanjiMode();
  422.                 moji.sjis = (unsigned short int)jiscode;
  423.                 i = ( moji.c[1] == 0x28 )? 0: info[np][0];
  424.                 switch( i )
  425.                 {
  426.                     case 0:/*明朝体*/
  427.                         if( colrev_flg == OFF )
  428.                             break;
  429.                         if( mint_flg == OFF )
  430.                             break;
  431.                         fseek( mint_fp, ((moji.c[1]-0x21)*94+(moji.c[0]-0x21)+128)*288+16, SEEK_SET );
  432.                         fread( gjbuf, 1, 288, mint_fp );
  433.                         break;
  434.                     case 1:/*ゴシック体*/
  435.                         if( colrev_flg == OFF )
  436.                             break;
  437.                         if( goth_flg == OFF )
  438.                             break;
  439.                         fseek( goth_fp, ((moji.c[1]-0x21)*94+(moji.c[0]-0x21)+128)*288+16, SEEK_SET );
  440.                         fread( gjbuf, 1, 288, goth_fp );
  441.                         break;
  442.                     case 2:/*毛筆体*/
  443.                         if( mouh_flg == OFF )
  444.                             break;
  445.                         fseek( mouh_fp, ((moji.c[1]-0x21)*94+(moji.c[0]-0x21)+128)*288+16, SEEK_SET );
  446.                         fread( gjbuf, 1, 288, mouh_fp );
  447.                         break;
  448.                     case 3:/*丸文字*/
  449.                         if( maru_flg == OFF )
  450.                             break;
  451.                         fseek( maru_fp, ((moji.c[1]-0x21)*94+(moji.c[0]-0x21))*74+18, SEEK_SET );
  452.                         fread( gjbuf2, 1, 72, maru_fp );
  453.                         convert24to48( gjbuf2, gjbuf );
  454.                         break;
  455.                     case 4:/*教科書体*/
  456.                         if( kyou_flg == OFF )
  457.                             break;
  458.                         fseek( kyou_fp, ((moji.c[1]-0x21)*94+(moji.c[0]-0x21))*74+18, SEEK_SET );
  459.                         fread( gjbuf2, 1, 72, kyou_fp );
  460.                         convert24to48( gjbuf2, gjbuf );
  461.                         break;
  462.                 }
  463.  
  464.                 if( ( i != 0 && i != 1 ) || ( colrev_flg == ON ) )
  465.                 {
  466.                     *(defgj+5) = (usrjis>>8)&0xff;
  467.                     *(defgj+6) = (usrjis)&0xff;
  468.                     bufp += addstrings( defgj, bufp );
  469.  
  470. /*                    if( colrev_flg == ON )
  471.                     {
  472.                         for( i=0; i<72; i++ )
  473.                             DWORD( gjbuf+i*4 ) ^= 0xffffffff;
  474.                     }????「ここでハングアップ」????*/
  475.  
  476.                     memcpy( bufp, gjbuf, 288 );
  477.                     bufp += 288;
  478.  
  479.                     moji.sjis = (unsigned short int)usrjis;
  480.                     ++ usrjis;
  481.                 }
  482.  
  483.                 *bufp++ = moji.c[1];
  484.                 *bufp++ = moji.c[0];
  485.                 x_pos += pitch*pitchmask/2;
  486.             }
  487.             else
  488.             {
  489.                 setAsciiMode();
  490.                 *bufp++ = (char)ch;
  491.                 x_pos += pitch*pitchmask/4;
  492.             }
  493.         }
  494.  
  495.         if( flushBuffer() )
  496.             break;
  497.  
  498.         lineTerm();
  499.         if( ! control )
  500.             ++ lnum;
  501.         if( lnum == lpp )
  502.             pageflg = ON;
  503.  
  504.         if( pageflg == ON )
  505.         {
  506.             lnum = 0;
  507.             if( writepage == ON )
  508.             {
  509.                 printPage( page );
  510.                 if( flushBuffer() )
  511.                     break;
  512.             }
  513.  
  514.             if( endflg == OFF )
  515.             {
  516.                 page++;
  517.                 y_pos = 0;
  518.                 pageflg = OFF;
  519.                 printReady( 6 );
  520.                 VC_printf( "現在%dページ目を印刷中です。\n", UL_INT, page );
  521.             }
  522.         }
  523.     }
  524.  
  525.     VC_printf( "印刷を終了します。\n" );
  526.     return;
  527. }
  528.